home *** CD-ROM | disk | FTP | other *** search
/ Workbench Add-On / Workbench Add-On - Volume 1.iso / BBS-Archive / Comm / AmiTCP30b2.lha / src / appl / napsaterm / tel_opt.c < prev    next >
C/C++ Source or Header  |  1994-05-14  |  3KB  |  169 lines

  1. /*
  2.  * $Id: tel_opt.c,v 3.1 1994/05/14 14:17:07 ppessi Exp $
  3.  *
  4.  * Author: Tomi Ollila <too@ajk.tele.fi>
  5.  *
  6.  * Copyright © 1993, 1994   AmiTCP/IP Group, <amitcp-group@hut.fi>
  7.  *                Helsinki University of Technology, Finland.
  8.  *                All rights reserved.
  9.  *
  10.  * Created: Thu Apr  7 15:33:19 1994 too
  11.  * Last modified: Fri May 13 02:37:51 1994 ppessi
  12.  *
  13.  * HISTORY
  14.  * $Log: tel_opt.c,v $
  15.  * Revision 3.1  1994/05/14  14:17:07  ppessi
  16.  * initial revision
  17.  *
  18.  * Revision 3.1  1994/04/17  11:31:54  too
  19.  * initial revision
  20.  *
  21.  */
  22.  
  23. #include "telnet.h"
  24. #include <arpa/telnet.h>
  25. #include "tel_opt.h"
  26. #include "tel_iacout.h"
  27.  
  28. static long telnet_flags;    /* telnet state information */
  29.  
  30. #define TF_ECHO  (1<<0)
  31. #define TF_SGA     (1<<1)
  32. #define TF_TTYPE (1<<2)
  33.  
  34. static void to_echo(u_char wwdd, u_char c);
  35. static void to_sga(u_char wwdd, u_char c);
  36. static void to_naws(u_char wwdd, u_char c);
  37. static void to_ttype(u_char wwdd, u_char c);
  38. static void to_notsup(u_char wwdd, u_char c);
  39.  
  40. void telopt(u_char wwdd, u_char c)
  41. {
  42.   switch (c) {
  43.   case TELOPT_ECHO:
  44.     to_echo(wwdd, c);
  45.     break;
  46.   case TELOPT_SGA:
  47.     to_sga(wwdd, c);
  48.     break;
  49.   case TELOPT_NAWS:
  50.     to_naws(wwdd, c);
  51.     break;
  52.   case TELOPT_TTYPE:
  53.     to_ttype(wwdd, c);
  54.     break;
  55.   default:
  56.     to_notsup(wwdd, c);
  57.     break;
  58.   }
  59. }
  60.  
  61. static void to_notsup(u_char wwdd, u_char c)
  62. {
  63.   if (wwdd == WILL)
  64.     putiac2(DONT, c);
  65.   else if (wwdd == DO)
  66.     putiac2(WONT, c);
  67. }
  68.  
  69. /*
  70.  * Handle local echo
  71.  */
  72. static void to_echo(u_char wwdd, u_char c)
  73. {
  74.   if (wwdd == DO) {
  75.     putiac2(WONT, c);
  76.     return;
  77.   }
  78.   else if (wwdd == DONT)
  79.     return;
  80.   
  81.   if (telnet_flags & TF_ECHO) {
  82.     if (wwdd == WILL) {
  83.       return;
  84.     }
  85.   }
  86.   else
  87.     if (wwdd == WONT) {
  88.       return;
  89.     }
  90.  
  91. #ifdef notyet
  92.   /* XXX if somebody will someday implement linemode for Napsaterm... */
  93.   if (unit->u_charmode != CHM_OFF)
  94.     telnet_flags ^= TF_ECHO;
  95. #endif
  96.  
  97.   if ((telnet_flags ^= TF_ECHO) & TF_ECHO)
  98.     putiac2(DO, c);
  99.   else
  100.     putiac2(DONT, c);
  101. }
  102.  
  103. /*
  104.  * Handle suppress-go-ahead
  105.  */
  106. static void to_sga(u_char wwdd, u_char c)
  107. {
  108.   if (telnet_flags & TF_SGA) {
  109.     if (wwdd == WILL)
  110.       return;
  111.   }
  112.   else
  113.     if (wwdd == WONT)
  114.       return;
  115.   
  116.   if ((telnet_flags ^= TF_SGA) & TF_SGA)
  117.     putiac2(DO, c);
  118.   else
  119.     putiac2(DONT, c);
  120. }
  121.  
  122. /*
  123.  * Handle window size
  124.  */
  125. static void to_naws(u_char wwdd, u_char c)
  126. {
  127.   if (okwinch) {
  128.     if (wwdd == DO)
  129.       return;
  130.   }
  131.   else
  132.     if (wwdd == DONT)
  133.       return;
  134.  
  135.   okwinch = (wwdd == DO);
  136.  
  137.   if (okwinch) {
  138.     putiac2(WILL, c);
  139.     do_naws();            /* Send the initial size */
  140.   } else {
  141.     putiac2(WONT, c);
  142.   }
  143. }
  144.  
  145.  
  146. /*
  147.  * Handle terminal type
  148.  */
  149. static void to_ttype(u_char wwdd, u_char c)
  150. {
  151.   if (telnet_flags & TF_TTYPE) {
  152.     if (wwdd == DO)
  153.       return;
  154.   }
  155.   else
  156.     if (wwdd == DONT)
  157.       return;
  158.  
  159.   /* Flip the flag and send WILL/WONT */
  160.   if ((telnet_flags ^= TF_TTYPE) & TF_TTYPE) {
  161.     putiac2(WILL, c);
  162.   } else {
  163.     putiac2(WONT, c);
  164.   }
  165. }
  166.  
  167.  
  168.  
  169.